/**
 * @file poj/3468
 * @author Ruiming Guo (guoruiming@stu.scu.edu.cn)
 * @brief 区间修改，区间查询，带懒标记
 * @see https://www.acwing.com/problem/content/244/
 * @version 1.0
 * @date 2022-05-06
 *
 * @copyright Copyright (c) 2022
 *
 **/
#include <cstdio>
using namespace std;
const int N = 100000 + 10;
#define mid (l + r >> 1)
#define ls (rt << 1)
#define rs (rt << 1 | 1)
typedef long long ll;
struct SegTree {
  ll sum[N * 4],  // sum[rt] 表示以 rt 为根的树管辖范围之和
      lazy_add[N * 4];  // lazy_add[rt] 表示 rt 管辖的范围中每个元素都增加了多少
  /**
   * @brief 以 rt 为根节点的线段树用子节点的信息更新自己
   *
   * @param rt 根节点
   **/
  void maintain(int rt) { sum[rt] = sum[ls] + sum[rs]; }
  /**
   * @brief 下放延迟标记，把lazy_add下放至两棵子树，同时更新子树的sum
   *
   * @param rt 根节点
   * @param l rt 管辖范围的左边界
   * @param r rt 管辖范围的右边界
   **/
  void pushdown(int rt, int l, int r) {
    ll &a = lazy_add[rt];
    if (a == 0) return;
    lazy_add[ls] += a, lazy_add[rs] += a;  // 下面压力来到了左右子节点上
    sum[ls] += a * (mid - l + 1), sum[rs] += a * (r - mid);
    a = 0;  // 清掉 rt 的标记
  }
  void build(int rt, int l, int r) {
    lazy_add[rt] = 0;
    if (l == r) {
      // 建树同时读入，因为建树时建到子节点的顺序是从 1 到 n 的
      scanf("%lld", &sum[rt]);
      return;
    }
    build(ls, l, mid), build(rs, mid + 1, r);
    maintain(rt);
  }
  /**
   * @brief 改
   *
   * @param rt 修改的根节点
   * @param val 被改成的值
   * @param ql 询问区间的左端点
   * @param qr 询问区间的右端点
   * @param l 该根节点控制区间的左端点
   * @param r 该根节点控制区间的右端点
   **/
  void update(int rt, ll val, int ql, int qr, int l, int r) {
    if (ql <= l && r <= qr) {  // rt 区间完全被询问 [L, R] 覆盖
                               // 进行整个区间的更新
      lazy_add[rt] += val;
      sum[rt] += val * (r - l + 1);
      return;
    }
    // 非完整区间更新
    pushdown(rt, l, r);
    if (ql <= mid) {
      update(ls, val, ql, qr, l, mid);
    }
    if (qr >= mid + 1) {
      update(rs, val, ql, qr, mid + 1, r);
    }
    maintain(rt);
  }
  /**
   * @brief 查
   *
   * @param rt 修改的根节点
   * @param ql 询问区间的左端点
   * @param qr 询问区间的右端点
   * @param l 该根节点控制区间的左端点
   * @param r 该根节点控制区间的右端点
   **/
  ll query(int rt, int ql, int qr, int l, int r) {
    if (ql <= l && r <= qr) return sum[rt];  // rt 区间完全被询问 [L, R] 覆盖
    pushdown(rt, l, r);
    ll ans = 0;
    if (ql <= mid) ans += query(ls, ql, qr, l, mid);
    if (qr >= mid + 1) ans += query(rs, ql, qr, mid + 1, r);
    return ans;
  }
} ST;
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  ST.build(1, 1, n);
  char s[2];
  for (int a, b, c; m--;) {
    scanf("%s%d%d", s, &a, &b);
    if (*s == 'Q') {
      printf("%lld\n", ST.query(1, a, b, 1, n));
    } else {
      scanf("%d", &c);
      ST.update(1, c, a, b, 1, n);
    }
  }
}
